home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / misc / emu / arosdev.lha / AROS / workbench / c / tasklist.c < prev    next >
C/C++ Source or Header  |  1997-01-27  |  3KB  |  132 lines

  1. /*
  2.     (C) 1995-97 AROS - The Amiga Replacement OS
  3.     $Id: tasklist.c,v 1.2 1997/01/27 00:22:38 ldp Exp $
  4.  
  5.     Desc: 
  6.     Lang: english
  7. */
  8.  
  9. #include <exec/memory.h>
  10. #include <exec/tasks.h>
  11. #include <exec/execbase.h>
  12. #include <proto/exec.h>
  13. #include <dos/dosextens.h>
  14. #include <proto/dos.h>
  15. #include <aros/machine.h>
  16.  
  17. struct task
  18. {
  19.     STRPTR name;
  20.     APTR address;
  21.     WORD type;
  22.     WORD state;
  23.     IPTR stacksize;
  24.     IPTR stackused;
  25. };
  26.  
  27. static int addtask(struct Task *task, struct task **t, STRPTR *e)
  28. {
  29.     STRPTR s1,s2;
  30.     (*t)->address=task;
  31.     (*t)->type=task->tc_Node.ln_Type;
  32.     (*t)->state=task->tc_State;
  33.     (*t)->stacksize=(STRPTR)task->tc_SPUpper-(STRPTR)task->tc_SPLower;
  34. #if AROS_STACK_GROWS_DOWNWARDS
  35.     (*t)->stackused=(STRPTR)task->tc_SPUpper-SP_OFFSET-(STRPTR)task->tc_SPReg;
  36. #else
  37.     (*t)->stackused=(STRPTR)task->tc_SPReg-SP_OFFSET-(STRPTR)task->tc_SPLower;
  38. #endif
  39.     if(task->tc_State==TS_RUN)
  40.         /* The tc_SPReg for the actual process is invalid
  41.            if it had no context switch yet */
  42.         (*t)->stackused=0;
  43.     s1=task->tc_Node.ln_Name;
  44.     if(task->tc_Node.ln_Type==NT_PROCESS&&((struct Process *)task)->pr_CLI)
  45.     {
  46.         /* TODO: Use cli_CommandName field for the name */
  47.         (*t)->type=-1;
  48.     }
  49.     if(s1!=NULL)
  50.     {
  51.         s2=s1;
  52.         while(*s2++)
  53.             ;
  54.         while(s2>s1)
  55.         {
  56.             if(*e<=(STRPTR)t)
  57.                 return 0;
  58.             *--(*e)=*--s2;
  59.         }
  60.     }
  61.     if((STRPTR)(*t+1)>*e)
  62.         return 0;
  63.     (*t)->name=*e;
  64.     ++*t;
  65.     return 1;
  66. }
  67.  
  68. static int fillbuffer(struct task **buffer, IPTR size)
  69. {
  70.     STRPTR end=(STRPTR)*buffer+size;
  71.     struct Task *task;
  72.     Disable();
  73.     if(!addtask(SysBase->ThisTask,buffer,&end))
  74.     {
  75.         Enable();
  76.         return 0;
  77.     }
  78.     for(task=(struct Task *)SysBase->TaskReady.lh_Head;
  79.         task->tc_Node.ln_Succ!=NULL;
  80.         task=(struct Task *)task->tc_Node.ln_Succ)
  81.         if(!addtask(task,buffer,&end))
  82.         {
  83.             Enable();
  84.             return 0;
  85.         }
  86.     for(task=(struct Task *)SysBase->TaskWait.lh_Head;
  87.         task->tc_Node.ln_Succ!=NULL;
  88.         task=(struct Task *)task->tc_Node.ln_Succ)
  89.         if(!addtask(task,buffer,&end))
  90.         {
  91.             Enable();
  92.             return 0;
  93.         }
  94.     Enable();
  95.     return 1;
  96. }
  97.  
  98. int main(int argc, char *argv[])
  99. {
  100.     IPTR size;
  101.     struct task *buffer,*tasks,*tasks2;
  102.     for(size=2048;;size+=2048)
  103.     {
  104.         buffer=AllocVec(size,MEMF_ANY);
  105.         if(buffer==NULL)
  106.         {
  107.             FPuts(Output(),"Not Enough memory for task buffer\n");
  108.             return 20;
  109.         }
  110.         tasks=buffer;
  111.         if(fillbuffer(&tasks,size))
  112.         {
  113.             FPuts(Output(),"address\t\ttype\tstate\tstack\tused\tname\n");
  114.             for(tasks2=buffer;tasks2<tasks;tasks2++)
  115.             {
  116.                 IPTR args[6];
  117.                 args[0]=(IPTR)tasks2->address;
  118.                 args[1]=(IPTR)(tasks2->type==NT_TASK?"task":
  119.                            tasks2->type==NT_PROCESS?"process":"CLI");
  120.                 args[2]=(IPTR)(tasks2->state==TS_RUN?"running":
  121.                            tasks2->state==TS_READY?"ready":"waiting");
  122.                 args[3]=tasks2->stacksize;
  123.                 args[4]=tasks2->stackused;
  124.                 args[5]=tasks2->name!=NULL?(IPTR)tasks2->name:0;
  125.                 VPrintf("0x%08.lx\t%s\t%s\t%ld\t%ld\t%s\n",args);
  126.             }
  127.             FreeVec(buffer);
  128.             return 0; 
  129.         }
  130.         FreeVec(buffer);
  131.     }
  132. }